import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

public class Main837ComBufferedReader {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in));
        String line;

		int numeroDeCT = Integer.parseInt(inReader.readLine());
		inReader.readLine();

		for (int j = 0; j < numeroDeCT; j++) {

			int numeroDeFilmes = Integer.parseInt(inReader.readLine());

			double[] pontosIniciais = new double[numeroDeFilmes];
			double[] pontosFinais = new double[numeroDeFilmes];
			double[] coeficientes = new double[numeroDeFilmes];

			List<Double> todosPontos = new ArrayList<Double>();

			for (int i = 0; i < numeroDeFilmes; i++) {

				String[] entradas = inReader.readLine().split(" ");

				double ponto1 = Double.parseDouble(entradas[0]);
				double ponto2 = Double.parseDouble(entradas[2]);
				coeficientes[i] = Double.parseDouble(entradas[4]);

				if (ponto2 > ponto1) {
					pontosIniciais[i] = ponto1;
					pontosFinais[i] = ponto2;
				} else {
					pontosIniciais[i] = ponto2;
					pontosFinais[i] = ponto1;
				}

				todosPontos.add(pontosIniciais[i]);
				todosPontos.add(pontosFinais[i]);

			}

			List<Double> ordenadoSemDuplicacao = getOrdenadoSemDuplicacao(todosPontos);

			System.out.println(ordenadoSemDuplicacao.size() + 1);
			if (ordenadoSemDuplicacao.isEmpty()) {
				System.out.println("-inf +inf 1.000");

				if (j != numeroDeCT - 1) {
					System.out.println();
					inReader.readLine();
				}

				continue;
			}

			// -inf -> primeiroPonto
			System.out.println("-inf " + new BigDecimal(ordenadoSemDuplicacao.get(0)).setScale(3, BigDecimal.ROUND_HALF_UP) + " 1.000");

			for (int i = 0; i < ordenadoSemDuplicacao.size(); i++) {

				double pontoAtual = ordenadoSemDuplicacao.get(i);
				double pontoProximo = Double.MIN_VALUE;

				if (i + 1 < ordenadoSemDuplicacao.size()) {
					pontoProximo = ordenadoSemDuplicacao.get(i + 1);
					System.out.print(new BigDecimal(pontoAtual).setScale(3, BigDecimal.ROUND_HALF_UP) + " " + new BigDecimal(pontoProximo).setScale(3, BigDecimal.ROUND_HALF_UP) + " ");
				} else {
					System.out.print(new BigDecimal(pontoAtual).setScale(3, BigDecimal.ROUND_HALF_UP) + " " + "+inf ");
				}

				double media = (pontoAtual + pontoProximo) / 2;

				double resultadoFinal = 1;
				for (int l = 0; l < pontosIniciais.length; l++) {

					if (i == ordenadoSemDuplicacao.size() - 1) {
						break;
					}

					if (media > pontosIniciais[l] && media < pontosFinais[l]) {
						resultadoFinal *= coeficientes[l];
					}

				}

				BigDecimal resultadoFinalBD = new BigDecimal(resultadoFinal);
				resultadoFinalBD = resultadoFinalBD.setScale(3, BigDecimal.ROUND_HALF_UP);

				System.out.println(resultadoFinalBD);
			}

			if (j != numeroDeCT - 1) {
				System.out.println();
				inReader.readLine();
			}
		}

	}

	private static List<Double> getOrdenadoSemDuplicacao(List<Double> todosPontos) {

		TreeSet<Double> treeSet = new TreeSet<Double>(todosPontos);

		List<Double> resposta = new ArrayList<Double>();

		for (Double d : treeSet) {
			resposta.add(d);
		}

		return resposta;
	}

}
